# Django Admin 管理工具 | 测试--readthedocs


目录


Source

Django 提供了基于 web 的管理工具。

Django自动管理工具是django.contrib的一部分。你可以在项目的 settings.py 中的INSTALLED_APPS看到它:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

django.contrib是一套庞大的功能集,它是Django基本代码的组成部分。


I.激活管理工具

通常我们在生成项目时会在urls.py中自动设置好,我们只需去掉注释即可。

配置项如下所示:

from django.contrib import admin
admin.autodiscover()

# And include this URLpattern...
urlpatterns = patterns('',
    # ...
    (r'^admin/', include(admin.site.urls)),
    # ...
)

i.实际urls.py

[root@master HelloWorld]# cat urls.py
"""HelloWorld URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
# Origin code
# from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
 ]

# from django.conf.urls import *
from HelloWorld.view import hello
from django.conf.urls import url
from HelloWorld.testdb import testdb
from HelloWorld import search
from HelloWorld import search2


urlpatterns = [
    url('^hello/$',hello),
    url('^testdb/$',testdb),
    url(r'^search-form/$',search.search_form),
    url(r'^search/$',search.search),
    url(r'^search-post/$',search2.search_post),
]

ii.报错NameError: name 'url' is not defined

运行服务器

[root@master HelloWorld]# python manage.py runserver 0.0.0.0:8000
Performing system checks...

Unhandled exception in thread started by <function wrapper at 0x23d4de8>
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 121, in inner_run
    self.check(display_num_errors=True)
  File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 374, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 361, in _run_checks
    return checks.run_checks(**kwargs)
  File "/usr/lib/python2.7/site-packages/django/core/checks/registry.py", line 81, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/lib/python2.7/site-packages/django/core/checks/urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "/usr/lib/python2.7/site-packages/django/core/checks/urls.py", line 24, in check_resolver
    for pattern in resolver.url_patterns:
  File "/usr/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/python2.7/site-packages/django/urls/resolvers.py", line 313, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/usr/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/python2.7/site-packages/django/urls/resolvers.py", line 306, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/root/python_project/HelloWorld/HelloWorld/urls.py", line 21, in <module>
    url(r'^admin/', admin.site.urls),
NameError: name 'url' is not defined

django.conf.urls官网

重新检查了一下urls.py,发现这个问题可能是和位置有关系,因为代码是从上往下执行的。这个时候还有导入url模块。即from django.conf.urls import url。要么把导入模块放到上面,要么把需要url的这段代码放到下面。

iii.解决NameError: name 'url' is not defined

更改urls.py

[root@master HelloWorld]# cat urls.py
"""HelloWorld URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
# Origin code
# from django.conf.urls import url
# from django.contrib import admin

# urlpatterns = [
#    url(r'^admin/', admin.site.urls),
# ]

# from django.conf.urls import *
from HelloWorld.view import hello
from django.conf.urls import url
from HelloWorld.testdb import testdb
from HelloWorld import search
from HelloWorld import search2
from django.contrib import admin

urlpatterns = [
    url('^hello/$',hello),
    url('^testdb/$',testdb),
    url(r'^search-form/$',search.search_form),
    url(r'^search/$',search.search),
    url(r'^search-post/$',search2.search_post),
]

urlpatterns = [
    url(r'^admin/', admin.site.urls),
 ]

更改完成后服务器变化

  File "/root/python_project/HelloWorld/HelloWorld/urls.py", line 21, in <module>
    url(r'^admin/', admin.site.urls),
NameError: name 'url' is not defined
Performing system checks...

System check identified no issues (0 silenced).
November 26, 2016 - 12:07:36
Django version 1.10.3, using settings 'HelloWorld.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

当这一切都配置好后,Django管理工具就可以运行了。


II.使用管理工具

启动开发服务器,然后在浏览器中访问:http://yoursite:8000/admin/,得到如下界面:

访问后服务器的变化

[26/Nov/2016 12:11:09] "GET /admin/ HTTP/1.1" 302 0
[26/Nov/2016 12:11:09] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1653
[26/Nov/2016 12:11:09] "GET /static/admin/css/login.css HTTP/1.1" 200 1203
[26/Nov/2016 12:11:09] "GET /static/admin/css/base.css HTTP/1.1" 200 15937
[26/Nov/2016 12:11:09] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[26/Nov/2016 12:11:09] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 80304
[26/Nov/2016 12:11:09] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 81348

1.10登录界面|center

1.10登录界面大图|center

源文档的图|center

你可以通过命令 python manage.py createsuperuser 来创建超级用户,如下所示:

# python manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address: admin@w3cschool.cc
Password:
Password (again):
Superuser created successfully.
[root@solar HelloWorld]#

i.实际测试创建用户

[root@master HelloWorld]# python manage.py createsuperuser
Username (leave blank to use 'root'): jason
Email address: 512380548@qq.com
Password: 
Password (again): 
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Password: 
Password (again): 
Superuser created successfully.

之后输入用户名密码登录,界面如下:

原文档

实际测试图

实际测试图

为了让admin界面管理某个数据模型,我们需要先注册该数据模型到admin。比如,我们之前在 TestModel 中已经创建了模型 Test 。修改 TestModel/admin.py:

from django.contrib import admin
from TestModel.models import Test

# Register your models here.
admin.site.register(Test)

实际TestModel/admin.py

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test

# Register your models here.
admin.site.register(Test)

刷新后即可看到 Testmodel 数据表:

原文档|center

实际测试图

实际测试|center

ii.插入数据

表中插入数据,点击ADD TEST

插入Wilson,并保存

插入成功

|center

MySQL数据库中查看

(root@localhost)(08:57:02) [test]> select * from TestModel_test;
+----+------------+
| id | name       |
+----+------------+
|  1 | JasonBourn |
|  5 | Wilson     |
+----+------------+
2 rows in set (0.00 sec)

因为之前测试过,没有具体观察这个id的规律。

iii.查看id变化规律

又插入数据到表中,观察这个id变化规律

(root@localhost)(08:59:45) [test]> select * from TestModel_test;
+----+------------+
| id | name       |
+----+------------+
|  1 | JasonBourn |
|  5 | Wilson     |
|  7 | testid     |
|  9 | the more   |
+----+------------+
4 rows in set (0.00 sec)

现在有问题,就是如何实现对所有数据库和表的增删改查的操作? 当前仅仅是针对一个表进程操作。


III.复杂模型

管理页面的功能强大,完全有能力处理更加复杂的数据模型。

先在 TestModel/models.py 中增加一个更复杂的数据模型:

from django.db import models

# Create your models here.
class Contact(models.Model):
    name   = models.CharField(max_length=200)
    age    = models.IntegerField(default=0)
    email  = models.EmailField()
    def __unicode__(self):
        return self.name

class Tag(models.Model):
    contact = models.ForeignKey(Contact)
    name    = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name

i.实际models.py

[root@master TestModel]# cat models.py
# from __future__ import unicode_literals

# from django.db import models

# Create your models here.

from django.db import models

class Test(models.Model):
    name = models.CharField(max_length=20)

class Contact(models.Model):
    name = models.CharField(max_length=200)
    age = models.IntegerField(default=0)
    email = models.EmailField()
    def __unicode__(self):
        return self.name

class Tag(models.Model):
    contact = models.ForeignKey(Contact)
    name = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name

这里有两个表。TagContact为外部键。一个Contact可以对应多个Tag

我们还可以看到许多在之前没有见过的属性类型,比如IntegerField用于存储整数。

TestModel/admin.py 注册多个模型并显示:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
admin.site.register([Test, Contact, Tag])

ii.实际TestModel/admin.py

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test

# Register your models here.
admin.site.register[(Test, Contact, Tag])

服务器的提示

  File "/root/python_project/HelloWorld/TestModel/admin.py", line 5
    admin.site.register[(Test, Contact, Tag])
                                           ^
SyntaxError: invalid syntax

iii.发现错误admin.py SyntaxError: invalid syntax

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
admin.site.register[(Test, Contact, Tag])

服务器的提示

  File "/root/python_project/HelloWorld/TestModel/admin.py", line 5
    admin.site.register[(Test, Contact, Tag])
                                           ^
SyntaxError: invalid syntax

iv.解决admin.py SyntaxError: invalid syntax问题

更改admin.py

仔细看了看发现是符号的位置有问题,其实自己没有仔细看错误。当然了到这里发现的是自己有两个错误,一个是导入不全面。另一个就是符号的位置。上面的提示已经非常明确的,就是你的[]有问题。

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
admin.site.register([Test, Contact, Tag])

服务器的提示变成正常

  File "/root/python_project/HelloWorld/TestModel/admin.py", line 5
    admin.site.register[(Test, Contact, Tag])
                                           ^
SyntaxError: invalid syntax
Performing system checks...

System check identified no issues (0 silenced).
November 26, 2016 - 13:47:28
Django version 1.10.3, using settings 'HelloWorld.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

刷新管理页面,显示结果如下:

原文档|center

v.实际测试

实际测试|center

 File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
ProgrammingError: (1146, "Table 'test.TestModel_tag' doesn't exist")
[26/Nov/2016 13:57:32] "GET /admin/TestModel/tag/ HTTP/1.1" 500 164692

估计还是需要同步一下数据库。那就没有其他的同步数据库的方式了吗?

1.同步数据库

[root@master HelloWorld]# ls
db.sqlite3  HelloWorld  manage.py  templates  TestModel
[root@master HelloWorld]# python manage.py makemigrations
Migrations for 'TestModel':
  TestModel/migrations/0002_contact_tag.py:
    - Create model Contact
    - Create model Tag
[root@master HelloWorld]# python manage.py migrate
Operations to perform:
  Apply all migrations: TestModel, admin, auth, contenttypes, sessions
Running migrations:
  Applying TestModel.0002_contact_tag... OK

2.访问contact

访问后的界面

contact|center

服务器端的提示

[26/Nov/2016 14:18:33] "GET /admin/TestModel/contact/ HTTP/1.1" 200 3059
[26/Nov/2016 14:18:33] "GET /admin/jsi18n/ HTTP/1.1" 200 3217

3.contact插入数据

插入数据界面

MySQL数据库中查看

(root@localhost)(10:25:57) [test]> show tables;
+----------------------------+
| Tables_in_test             |
+----------------------------+
| TestModel_contact          |
| TestModel_tag              |
| TestModel_test             |
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
13 rows in set (0.00 sec)

(root@localhost)(10:25:58) [test]> select * from TestModel_contact;
+----+------+-----+---------------+
| id | name | age | email         |
+----+------+-----+---------------+
|  1 | John |  18 | test@gmai.com |
+----+------+-----+---------------+
1 row in set (0.00 sec)

从上面的表中可以看到

  • TestModel_contact
  • TestModel_tag

是新建立的。不过并没有测试这个是在执行了python manage.py migrate之前,还是之后的。我的假设是执行了这个命令之后产生的。因为执行前,在访问的时候,报的错误是没有这个表的。

4.访问tag

访问tag界面

|center

[26/Nov/2016 14:21:29] "GET /admin/TestModel/tag/ HTTP/1.1" 200 3031
[26/Nov/2016 14:21:29] "GET /admin/jsi18n/ HTTP/1.1" 200 3217

5.tag 插入数据测试

tag 插入数据界面

MySQL中查看

(root@localhost)(10:29:37) [test]> select * from TestModel_tag;
+----+------+------------+
| id | name | contact_id |
+----+------+------------+
|  1 | SRE  |          1 |
+----+------+------------+
1 row in set (0.00 sec)

服务器的提示

[26/Nov/2016 14:29:48] "POST /admin/TestModel/tag/add/ HTTP/1.1" 302 0

在以上管理工具我们就能进行复杂模型操作。


IV.自定义表单

我们可以自定义管理页面,来取代默认的页面。比如上面的"add"页面。我们想只显示nameemail部分。修改 TestModel/admin.py:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
class ContactAdmin(admin.ModelAdmin):
    fields = ('name', 'email')

admin.site.register(Contact, ContactAdmin)
admin.site.register([Test, Tag])

i.实际代码admin.py

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
# admin.site.register([Test, Contact, Tag])
class ContactAdmin(admin.ModelAdmin):
    fields = ('name','email')

admin.site.register(Contact,ContactAdmin)
admin.site.register([Test,Tag])
[root@master HelloWorld]# python manage.py runserver 0.0.0.0:8000
Performing system checks...

System check identified no issues (0 silenced).
November 27, 2016 - 00:16:22
Django version 1.10.3, using settings 'HelloWorld.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
Performing system checks...

System check identified no issues (0 silenced).
November 27, 2016 - 00:16:54
Django version 1.10.3, using settings 'HelloWorld.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

服务器端检测没有问题

以上代码定义了一个ContactAdmin类,用以说明管理页面的显示格式。

里面的fields属性定义了要显示的字段。

由于该类对应的是Contact数据模型,我们在注册的时候,需要将它们一起注册。显示效果如下:

源文档

ii.访问contact测试

实际测试

iii.contact插入数据测试

插入数据成功

|center

查看MySQL

(root@localhost)(08:29:01) [test]> select * from TestModel_contact;
+----+------+-----+----------------+
| id | name | age | email          |
+----+------+-----+----------------+
|  1 | John |  18 | test@gmail.com |
|  3 | rose |   0 | rose@gmail.com |
+----+------+-----+----------------+
2 rows in set (0.00 sec)

我们还可以将输入栏分块,每个栏也可以定义自己的格式。修改TestModel/admin.py为:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
class ContactAdmin(admin.ModelAdmin):
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',), # CSS
            'fields': ('age',),
        }]
    )

admin.site.register(Contact, ContactAdmin)
admin.site.register([Test, Tag])

iv.输入栏分块--实际代码admin.py

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
# admin.site.register([Test, Contact, Tag])

# class ContactAdmin(admin.ModelAdmin):
#    fields = ('name','email')

class ContactAdmin(admin.ModelAdmin):
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]
    )

admin.site.register(Contact,ContactAdmin)
admin.site.register([Test,Tag])

上面的栏目分为了MainAdvance两部分。classes说明它所在的部分的CSS格式。这里让Advance部分隐藏:

原文档

v.输入栏分块实际测试--show

|center

Advance部分旁边有一个 Show 按钮,用于展开,展开后可点击 Hide 将其隐藏,如下图所示:

原文档

vi.输入栏分块实际测试--hide

实际测试|center

1.插入数据测试

|center

|center

2.查看MySQL

(root@localhost)(08:29:10) [test]> select * from TestModel_contact;
+----+--------------+-----+------------------+
| id | name         | age | email            |
+----+--------------+-----+------------------+
|  1 | John         |  18 | test@gmail.com   |
|  3 | rose         |   0 | rose@gmail.com   |
|  5 | blockSeprate |  20 | blocak@gmail.com |
+----+--------------+-----+------------------+
3 rows in set (0.01 sec)

V.内联(Inline)显示

上面的ContactTag的外部键,所以有外部参考的关系。

而在默认的页面显示中,将两者分离开来,无法体现出两者的从属关系。我们可以使用内联显示,让Tag附加在Contact的编辑页面上显示。

修改TestModel/admin.py

from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
class TagInline(admin.TabularInline):
    model = Tag

class ContactAdmin(admin.ModelAdmin):
    inlines = [TagInline]  # Inline
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]

    )

admin.site.register(Contact, ContactAdmin)
admin.site.register([Test])

i.实际代码admin.py

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
# admin.site.register([Test, Contact, Tag])

# class ContactAdmin(admin.ModelAdmin):
#    fields = ('name','email')

# custome form
# class ContactAdmin(admin.ModelAdmin):
#    fieldsets = (
#        ['Main',{
#            'fields':('name','email'),
#        }],
#        ['Advance',{
#            'classes': ('collapse',),
#            'fields': ('age',),
#        }]
#    )

class TagInline(admin.TabularInline):
    model = Tag

class ConatactAdmin(admin.ModelAdmin):
    inlines = [TagInline]
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]

    )

admin.site.register(Contact,ContactAdmin)
admin.site.register([Test,Tag])

服务器提示

  File "/root/python_project/HelloWorld/TestModel/admin.py", line 38, in <module>
    admin.site.register(Contact,ContactAdmin)
NameError: name 'ContactAdmin' is not defined

更改admin.py

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
# admin.site.register([Test, Contact, Tag])

# class ContactAdmin(admin.ModelAdmin):
#    fields = ('name','email')

# custome form
# class ContactAdmin(admin.ModelAdmin):
#    fieldsets = (
#        ['Main',{
#            'fields':('name','email'),
#        }],
#        ['Advance',{
#            'classes': ('collapse',),
#            'fields': ('age',),
#        }]
#    )

class TagInline(admin.TabularInline):
    model = Tag

class ContactAdmin(admin.ModelAdmin):
    inlines = [TagInline]
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]

    )

admin.site.register(Contact,ContactAdmin)
admin.site.register([Test,Tag])

是在定义ContactAdmin这个类的时候,拼写出现错误。

显示效果如下:

原文档

小图|center

服务器端提示

[27/Nov/2016 01:03:14] "GET /static/admin/js/inlines.js HTTP/1.1" 200 13404

ii.使用内联插入数据

内联插入数据成功

iii.从MySQL中查看插入的数据

(root@localhost)(08:45:03) [test]> select * from TestModel_contact;
+----+--------------+-----+------------------+
| id | name         | age | email            |
+----+--------------+-----+------------------+
|  1 | John         |  18 | test@gmail.com   |
|  3 | rose         |   0 | rose@gmail.com   |
|  5 | blockSeprate |  20 | blocak@gmail.com |
|  7 | Jack         |  21 | jack@163.com     |
+----+--------------+-----+------------------+
4 rows in set (0.01 sec)
(root@localhost)(09:08:50) [test]> select * from TestModel_tag;
+----+-------+------------+
| id | name  | contact_id |
+----+-------+------------+
|  1 | SRE   |          1 |
|  3 | jack  |          7 |
|  5 | email |          7 |
|  7 | age   |          7 |
+----+-------+------------+
4 rows in set (0.00 sec)

VI.列表页的显示

Contact输入数条记录后,Contact的列表页看起来如下:

我们也可以自定义该页面的显示,比如在列表中显示更多的栏目,只需要在ContactAdmin中增加list_display属性:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
class ContactAdmin(admin.ModelAdmin):
    list_display = ('name','age', 'email') # list

admin.site.register(Contact, ContactAdmin)
admin.site.register([Test, Tag])

i.列表显示实际代码admin.py

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
# admin.site.register([Test, Contact, Tag])

# class ContactAdmin(admin.ModelAdmin):
#    fields = ('name','email')

# custome form
# class ContactAdmin(admin.ModelAdmin):
#    fieldsets = (
#        ['Main',{
#            'fields':('name','email'),
#        }],
#        ['Advance',{
#            'classes': ('collapse',),
#            'fields': ('age',),
#        }]
#    )

class TagInline(admin.TabularInline):
    model = Tag

class ContactAdmin(admin.ModelAdmin):
    list_display = ('name','age','email')
    inlines = [TagInline]
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]

    )

admin.site.register(Contact,ContactAdmin)
admin.site.register([Test,Tag])

刷新页面显示效果如下:

原文档

ii.列表显示实际测试

实际测试

搜索功能在管理大量记录时非常有,我们可以使用search_fields为该列表页增加搜索栏:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
class ContactAdmin(admin.ModelAdmin):
    list_display = ('name','age', 'email') 
    search_fields = ('name',)

admin.site.register(Contact, ContactAdmin)
admin.site.register([Test])

iii.搜索栏实际代码admin.py

[root@master TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag

# Register your models here.
# admin.site.register([Test, Contact, Tag])

# class ContactAdmin(admin.ModelAdmin):
#    fields = ('name','email')

# custome form
# class ContactAdmin(admin.ModelAdmin):
#    fieldsets = (
#        ['Main',{
#            'fields':('name','email'),
#        }],
#        ['Advance',{
#            'classes': ('collapse',),
#            'fields': ('age',),
#        }]
#    )

class TagInline(admin.TabularInline):
    model = Tag

class ContactAdmin(admin.ModelAdmin):
    list_display = ('name','age','email')
    search_fields = ('name',)
    inlines = [TagInline]
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]

    )

admin.site.register(Contact,ContactAdmin)
admin.site.register([Test,Tag])

在本实例中我们搜索了 namew3cschool.cc(本站域名) 的记录,显示结果如下:

原文档

iv.搜索栏实际测试

刷新动作带来的变化

[27/Nov/2016 01:17:07] "GET /static/admin/img/search.svg HTTP/1.1" 304 0
[27/Nov/2016 01:17:07] "GET /admin/jsi18n/ HTTP/1.1" 200 3217

搜索rose

Django Admin 管理工具还有非常多实用的功能,感兴趣的同学可以深入研究下。